-- DailyItemStatM
-- create by panyl
-- 物品统计

module("DailyItemStatM", package.seeall);

-- 成员变量
local dailyItems = {};
local itemMap = {};
local statMap = {};

local whenDoBonus;

-- 载入配置表
local _init = false;
local loadCsv = function()
    if _init then return end
    _init = true;

    dailyItems = {};
    itemMap = {};
    statMap = {};

    local daily_item_limit_CSV = get_daily_item_limit_CSV();
    for i = 1, #daily_item_limit_CSV do
        local row = daily_item_limit_CSV[i];

        dailyItems[row["id"]] = row;

        itemMap[row["class_id"]] = row["id"];

        statMap[row["stat_target"]] = statMap[row["stat_target"]] or {};

        table.insert(statMap[row["stat_target"]], row["id"]);
    end

    daily_item_limit_CSV = {};
end

-- 初始
function init()
    loadCsv();

    EventMgr.removeAll("DailyItemStatM");

    -- 关注奖励事件
    EventMgr.register("DailyItemStatM", event.DO_BONUS, whenDoBonus);
end

-- 奖励回调
whenDoBonus = function(para)
    -- 如果不是在迷宫内的
    if not DungeonM.isInDungeon() or DUNGEON_GAMING ~= DungeonM.getState() then
        return;
    end

    -- 如果不是物品奖励
    if para[1] ~= 1 then
        return
    end

    -- 统计
    recordStat(para[2], para[3]);
end

-- 检索统计项信息
function query(id, path)
    local m = dailyItems[id] or {};

    if not path then
        return m;
    end

    return m[path];
end

-- 是否需要统计的道具
function isDailyStat(classId)
    if itemMap[classId] then
        return true;
    else
        return false;
    end
end

-- 道具统计
function recordStat(classId, count)
    -- 如果不是需要统计的物品
    if not itemMap[classId] then
        return;
    end

    -- 尝试进行永久统计，客户端不用处理，到服务器之后自然会处理
    -- recordForeverStat(classId, count);

    local stat = ME.user.dbase:query("daily_item_stat", {});
    ME.user.dbase:set("daily_item_stat", stat);

    local id = itemMap[classId];

    stat[id] = (stat[id] or 0) + count;
end

-- 永久统计
function recordForeverStat(classId, count)
    -- 如果不是需要统计的物品
    if not itemMap[classId] then
        return;
    end

    local id = itemMap[classId];
    if not query(id, "forever") then
        return;
    end

    local stat = ME.user.dbase:query("forever_item_stat", {});
    ME.user.dbase:set("forever_item_stat", stat);

    stat[id] = (stat[id] or 0) + count;
end
